<?php

/**
 * JPGraph v4.0.3
 */

namespace lemon\JpGraph\Util;

use lemon\JpGraph\Image;
use lemon\JpGraph\Text;

/**
 * An image based error handler.
 */
class JpGraphErrObjectImg extends JpGraphErrObject
{
	public function __construct(){
		parent::__construct();
		// Empty. Reserved for future use
	}

	public function Raise($aMsg, $aHalt = true){
		$img_iconerror =
			'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV' .
			'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/' .
			'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY' .
			'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea' .
			'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx' .
			'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4' .
			'2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+' .
			'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6' .
			'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3' .
			'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0' .
			'6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS' .
			'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk' .
			'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc' .
			'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx' .
			'qL72fwAAAABJRU5ErkJggg==';

		if (function_exists('imagetypes')) {
			$supported = imagetypes();
		} else {
			$supported = 0;
		}

		if (!function_exists('imagecreatefromstring')) {
			$supported = 0;
		}

		if (ob_get_length() || headers_sent() || !($supported & IMG_PNG)) {
			// Special case for headers already sent or that the installation doesn't support
			// the PNG format (which the error icon is encoded in).
			// Dont return an image since it can't be displayed
			die($this->iTitle . ' ' . $aMsg);
		}

		$aMsg  = wordwrap($aMsg, 55);
		$lines = substr_count($aMsg, "\n");

		// Create the error icon GD
		$erricon = Image\Image::CreateFromString(base64_decode($img_iconerror, true));

		// Create an image that contains the error text.
		$w = 400;
		$h = 100 + 15 * max(0, $lines - 3);

		$img = new Image\Image($w, $h);

		// Drop shadow
		$img->SetColor('gray');
		$img->FilledRectangle(5, 5, $w - 1, $h - 1, 10);
		$img->SetColor('gray:0.7');
		$img->FilledRectangle(5, 5, $w - 3, $h - 3, 10);

		// Window background
		$img->SetColor('lightblue');
		$img->FilledRectangle(1, 1, $w - 5, $h - 5);
		$img->CopyCanvasH($img->img, $erricon, 5, 30, 0, 0, 40, 40);

		// Window border
		$img->SetColor('black');
		$img->Rectangle(1, 1, $w - 5, $h - 5);
		$img->Rectangle(0, 0, $w - 4, $h - 4);

		// Window top row
		$img->SetColor('darkred');
		for ($y = 3; $y < 18; $y += 2) {
			$img->Line(1, $y, $w - 6, $y);
		}

		// "White shadow"
		$img->SetColor('white');

		// Left window edge
		$img->Line(2, 2, 2, $h - 5);
		$img->Line(2, 2, $w - 6, 2);

		// "Gray button shadow"
		$img->SetColor('darkgray');

		// Gray window shadow
		$img->Line(2, $h - 6, $w - 5, $h - 6);
		$img->Line(3, $h - 7, $w - 5, $h - 7);

		// Window title
		$m = floor($w / 2 - 5);
		$l = 110;
		$img->SetColor('lightgray:1.3');
		$img->FilledRectangle($m - $l, 2, $m + $l, 16);

		// Stroke text
		$img->SetColor('darkred');
		$img->SetFont(FF_FONT2, FS_BOLD);
		$img->StrokeText($m - 90, 15, $this->iTitle);
		$img->SetColor('black');
		$img->SetFont(FF_FONT1, FS_NORMAL);
		$txt = new Text\Text($aMsg, 52, 25);
		$txt->SetFont(FF_FONT1);
		$txt->Align('left', 'top');
		$txt->Stroke($img);
		if ($this->iDest) {
			$img->Stream($this->iDest);
		} else {
			$img->Headers();
			$img->Stream();
		}
		if ($aHalt) {
			die();
		}
	}
}
